package com.etocrm.saas.lib.base.common.obj;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;

import java.io.Serializable;

/**
 * 所有bean的基类
 */
@Setter
@Getter
@Slf4j
public class BaseO implements Serializable {

    /**
     * 拷贝属性值，忽略值为null的属性
     *
     * @param source 原实体
     * @param target 目标实体
     */
    public static void copyProperties(Object source, Object target) {
        BeanUtil.copyProperties(source, target, new CopyOptions().setIgnoreNullValue(true));
    }


    /**
     * 拷贝属性值，忽略为null的属性，忽略自定义属性
     *
     * @param source           原实体
     * @param target           目标实体
     * @param ignoreProperties 需要忽略的属性
     */
    public static void copyPropertiesIgnoreCustom(Object source, Object target, String... ignoreProperties) {
        BeanUtil.copyProperties(source, target, new CopyOptions().setIgnoreNullValue(true).setIgnoreProperties(ignoreProperties));
    }

    /**
     * 拷贝原实体的属性值赋值给当前类对应属性，忽略值为null的属性
     *
     * @param source 原实体
     * @return this
     */
    public BaseO copyPropertiesFrom(Object source) {
        copyProperties(source, this);
        return this;
    }


    /**
     * 拷贝原实体的属性值赋值给当前类对应属性，忽略值为null的属性，忽略指定属性
     *
     * @param source           原实体
     * @param ignoreProperties 需要忽略的属性
     * @return this
     */
    public BaseO copyPropertiesIgnoreCustomFrom(Object source, String... ignoreProperties) {
        copyPropertiesIgnoreCustom(source, this, ignoreProperties);
        return this;
    }
}
